using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._LASDataset
{
    /// <summary>
    /// <para>Add Files To LAS Dataset</para>
    /// <para>Adds references for one or more LAS files and  surface constraint features to a LAS dataset.</para>
    /// <para>将一个或多个 LAS 文件和曲面约束要素的参照添加到 LAS 数据集。</para>
    /// </summary>    
    [DisplayName("Add Files To LAS Dataset")]
    public class AddFilesToLasDataset : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AddFilesToLasDataset()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_las_dataset">
        /// <para>Input LAS Dataset</para>
        /// <para>The LAS dataset to process.</para>
        /// <para>要处理的 LAS 数据集。</para>
        /// </param>
        public AddFilesToLasDataset(object _in_las_dataset)
        {
            this._in_las_dataset = _in_las_dataset;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Add Files To LAS Dataset";

        public override string CallName => "management.AddFilesToLasDataset";

        public override List<string> AcceptEnvironments => ["scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_las_dataset, _in_files, _folder_recursion.GetGPValue(), _in_surface_constraints, _derived_las_dataset];

        /// <summary>
        /// <para>Input LAS Dataset</para>
        /// <para>The LAS dataset to process.</para>
        /// <para>要处理的 LAS 数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input LAS Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_las_dataset { get; set; }


        /// <summary>
        /// <para>LAS Files or Folders</para>
        /// <para><xdoc>
        ///   <para>Input files can reference any combination of individual LAS files and folders containing LAS data.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入文件可以引用单个 LAS 文件和包含 LAS 数据的文件夹的任意组合。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("LAS Files or Folders")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _in_files { get; set; } = null;


        /// <summary>
        /// <para>Include subfolders</para>
        /// <para><xdoc>
        ///   <para>Specifies whether .las files residing in the subdirectories of an input folder will be referenced by the LAS dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Only .las files residing in an input folder will be added to the LAS dataset. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—All .las files residing in the subdirectories of an input folder will be added to the LAS dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定 LAS 数据集是否引用驻留在输入文件夹的子目录中的 .las 文件。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 仅将驻留在输入文件夹中的 .las 文件添加到 LAS 数据集中。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 驻留在输入文件夹子目录中的所有 .las 文件都将添加到 LAS 数据集中。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include subfolders")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _folder_recursion_value _folder_recursion { get; set; } = _folder_recursion_value._false;

        public enum _folder_recursion_value
        {
            /// <summary>
            /// <para>RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("RECURSION")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_RECURSION")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Surface Constraints</para>
        /// <para><xdoc>
        ///   <para>The features that will contribute to the definition of the triangulated surface generated from the LAS dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Input Features—The features with geometry that will be incorporated into the LAS dataset's triangulated surface.</bullet_item><para/>
        ///     <bullet_item>Height Field—The feature's elevation source can be derived from any numeric field in the feature's attribute table or the geometry by selecting Shape.Z. If no height is necessary, specify the keyword <None> to create z-less features with elevation that will be interpolated from the surface.</bullet_item><para/>
        ///     <bullet_item>Type—Defines the feature's role in the triangulated surface generated from the LAS dataset. Options with hard or soft designation refer to whether the feature edges represent distinct breaks in slope or a gradual change.</bullet_item><para/>
        ///     <bullet_item>Surface Feature Type—The surface feature type that defines how the feature geometry will be incorporated into the triangulation for the surface. Options with hard or soft designation refer to whether the feature edges represent distinct breaks in slope or a gradual change.
        ///     <bulletList>
        ///       <bullet_item>anchorpoints—Elevation points that will not be thinned away. This option is only available for single-point feature geometry.  </bullet_item><para/>
        ///       <bullet_item>hardline or softline—Breaklines that enforce a height value.  </bullet_item><para/>
        ///       <bullet_item>hardclip or softclip—Polygon dataset that defines the boundary of the LAS dataset.  </bullet_item><para/>
        ///       <bullet_item>harderase or softerase—Polygon dataset that defines holes in the LAS dataset.  </bullet_item><para/>
        ///       <bullet_item>hardreplace or softreplace—Polygon dataset that defines areas of constant height.  </bullet_item><para/>
        ///     </bulletList>
        ///     </bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>有助于定义从 LAS 数据集生成的三角剖分曲面的要素。</para>
        ///   <bulletList>
        ///     <bullet_item>输入要素 - 将合并到 LAS 数据集三角化曲面的几何要素。</bullet_item><para/>
        /// <bullet_item>高度字段 - 要素的高程源可从要素属性表中的任何数值字段或几何中派生，方法是选择 Shape.Z。如果不需要高度，则指定关键字<None>以创建具有将从表面插值的高程的无 z 要素。</bullet_item><para/>
        ///     <bullet_item>类型 - 定义要素在根据 LAS 数据集生成的三角化曲面中的角色。具有硬或软名称的选项是指要素边是表示斜率中的明显断裂还是渐变。</bullet_item><para/>
        /// <bullet_item>曲面要素类型 （Surface Feature Type） - 定义如何将要素几何合并到曲面三角剖分中的曲面要素类型。具有硬或软名称的选项是指要素边是表示斜率中的明显断裂还是渐变。
        ///     <bulletList>
        ///       <bullet_item>锚点 - 不会细化的高程点。此选项仅适用于单点要素几何。 </bullet_item><para/>
        ///       <bullet_item>hardline 或 softline - 强制执行高度值的分隔线。</bullet_item><para/>
        ///       <bullet_item>硬裁剪或软裁剪 - 定义 LAS 数据集边界的面数据集。</bullet_item><para/>
        ///       <bullet_item>harderase 或 softerase - 定义 LAS 数据集中的孔的面数据集。</bullet_item><para/>
        ///       <bullet_item>hardreplace 或 softreplace—定义恒定高度区域的面数据集。</bullet_item><para/>
        ///     </bulletList>
        ///     </bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface Constraints")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_surface_constraints { get; set; } = null;


        /// <summary>
        /// <para>Updated Input LAS Dataset</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Input LAS Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_las_dataset { get; set; }


        public AddFilesToLasDataset SetEnv(object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}